package com.school.sports.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Collections;

/**
 * 用户表实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")
public class User implements UserDetails {
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 用户名
     */
    private String username;

    /**
     * 密码哈希值
     */
    @TableField("password_hash")
    private String passwordHash;

    /**
     * 真实姓名
     */
    private String realName;

    /**
     * 性别：男、女
     */
    private String gender;

    /**
     * 班级（原字段为class，避免关键字冲突）
     */
    private String className;

    /**
     * 学院
     */
    private String college;

    /**
     * 手机号
     */
    private String phone;

    /**
     * 邮箱
     */
    private String email;

    /**
     * 外键指向role表
     */
    private Integer roleId;

    /**
     * 是否激活：1-激活，0-未激活
     */
    private Boolean isActive;

    /**
     * 逻辑删除标记：0-未删除，1-已删除
     */
    @TableLogic
    private Integer deleted;

    /**
     * 创建时间
     */
    private LocalDateTime createdAt;

    /**
     * 更新时间
     */
    private LocalDateTime updatedAt;

    /**
     * 角色名称（关联查询时使用）
     */
    private String roleName;

    /**
     * 获取用户角色（为了兼容性）
     */
    public String getRole() {
        return roleName;
    }

    // ============ UserDetails 接口实现 ============

    /**
     * 获取用户权限
     * @return 用户权限集合
     */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // 返回用户权限，这里简化处理，直接返回角色名
        if (roleName != null) {
            return Collections.singletonList(new SimpleGrantedAuthority("ROLE_" + roleName));
        }
        return Collections.emptyList();
    }

    /**
     * 获取用户密码
     * @return 密码哈希值
     */
    @Override
    public String getPassword() {
        return passwordHash;
    }

    /**
     * 账户是否未过期
     * @return true-未过期，false-已过期
     */
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    /**
     * 账户是否未锁定
     * @return true-未锁定，false-已锁定
     */
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    /**
     * 凭证是否未过期
     * @return true-未过期，false-已过期
     */
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    /**
     * 账户是否可用
     * @return true-可用，false-不可用
     */
    @Override
    public boolean isEnabled() {
        return isActive != null && isActive;
    }
}